package com.zhangxin.wbsocket;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;

public class WSServerInitialzer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel socketChannel) throws Exception {

        ChannelPipeline pipeline = socketChannel.pipeline();

        // websocket 是基于http的协议，所以需要对其进行编码解码
        pipeline.addLast(new HttpServerCodec());
        // 对大数据流进行读写
        pipeline.addLast(new ChunkedWriteHandler());
        // 对httpMessage进行聚合，聚合成FullHttpRequest或FullHttpResponse
        // 几乎在netty中的编程，都会使用到此handler
        pipeline.addLast(new HttpObjectAggregator(64 * 1024));
        // 以上是对http协议的支持=======================
        // 添加websocket协议，给指定的客户端连接访问路由协议 /ws
        // 这个handler会帮助你解决很多繁杂的问题 比如：握手啊，ping啊之类
        // 对于websocket来讲都是其传输都是基于frames, 不同的数据类型具有不同的frames
        pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));

        pipeline.addLast(new ChatHandler());

    }
}
